import axios from "axios";
import { Message } from "view-ui-plus";
import store from "@/store";
import router from "@/router";

const baseUrl = "http://localhost:8089"; //配置固定域名

axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios的对象
const request = axios.create({
  baseURL: baseUrl,
  timeout: 5000,
});

// 请求拦截
// 所有的网络请求都会走这个方法,可以在请求添加自定义内容
request.interceptors.request.use(
  (config) => {
    let token = store.state.token;
    if (token) {
      config.headers.Authorization = "DK" + token;
    }
    // get请求映射params参数
    /*if (config.method === "get" && config.params) {
      console.log("----------");
      console.log(config.url);
      let url = config.url + "?" + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
      console.log(config);
      return config;
    } else {
      return config;
    }*/
    return config;
  },
  (err) => {
    return Promise.reject(err);
  }
);

// 响应拦截
// 此处可以根据服务器返回的状态码做相应的数据
request.interceptors.response.use(
  (response) => {
    if (response.status == 200 && response.data.code === 200) {
      return Promise.resolve(response.data);
    } else {
      return Promise.reject(response.data.msg);
    }
  },
  function (error) {
    if (!error.response) {
      Message.error(error.message);
    } else {
      //  请求返回码
      let code;
      if (error.response) {
        code = error.response.status;
      }
      //  请求返回错误
      const data = error.response.data;
      if (code) {
        //  如果是未授权
        if (code === 401) {
          console.log("401");
          //  说明token过期，使用refreshToken对当前token进行刷新
          const refresh = store.state.refreshToken;
          //  如果存在
          if (refresh) {
            console.log("刷新token");
            return againRequest(refresh, error);
            //  否则
          } else {
            //  清空token
            store.commit("setToken", null);
            //  并跳转到登录页面，进行重新登录
            router.push("/");
          }
          //  如果是没有权限
        } else if (code === 403) {
          //  直接跳转至401页面
          router.replace({ path: "/401" });
          //  如果是服务器异常或其他异常
        } else {
          //  如果存在异常信息，显示异常信息
          if (data) {
            Message.error(data.detail);
          }
        }
      } else {
        Message.error("接口请求失败");
      }
    }
    return Promise.reject(error);
  }
);

/**
 * 重新请求
 * @param error
 * @returns {Promise<void>}
 */
async function againRequest(refresh, error) {
  await refreshToken(refresh);
  const config = error.response.config;
  config.headers["Authorization"] = "DK" + store.state.token;
  const res = await axios.request(config);
  return res.data;
}

/**
 * 刷新token
 * @param refresh
 * @param config
 */
export function refreshToken(refresh) {
  //  刷新token
  return axios({
    url:
      process.env.NODE_ENV === "production"
        ? process.env.VUE_APP_BASE_URL
        : "http://localhost:8089" + "/api/refresh",
    method: "put",
    headers: {
      Authorization: `DK${refresh}`,
    },
  }).then((res) => {
    if (res.data.success) {
      //  刷新token
      store.dispatch("setToken", res.data.data);
    } else {
      Message.error(res.msg);
      //  清空token
      store.dispatch("setToken", null);
    }
  });
}

export default request;
